package Enea.project.dcc;

import Enea.project.*;
import java.io.IOException;

/**
* L'interfaccia DCC (Dispatching and Coordination Core) è l'interfaccia che 
* descrive e definisce le funzionalità offerte dal Server Side del progetto. 
*
* @author Davide Aversa
*/
public interface DCC {

    /**
     * Restituisce il ProjectID.
     * @return Il ProjectID.
     */
    public int getID();
    
    public ClientData getClientByID(int clientid);
    
    /**
    * Avvia il server del progetto sulla porta specificata.
    *
    * @param portnumber Indica la porta sul quale viene avviato il server.
    * @throws IOException
    */
    public void startServer(int portnumber) throws IOException;
    
    /**
    * Restituisce una Work Unit per il client dato.
    *
    * @param client Indica il client per cui è richiesta la Work Unit.
    * @return Restituisce la Work Unit per il client.
    */
    public WorkUnit giveMeWork(ClientData client);
    
    /**
    * Consegna al progetto il risultato elaborato dal client.
    *
    * @param client Indica il client che ha consegnato il risultato.
    * @param result L'oggetto che contiene il risultato.
    */
    public void takeResults(ClientData client, ResultsPack result);
    
    /**
    * Registra il client passato come parametro nella lista dei client attivi
    * per il progetto.
    *
    * @param client Indica il client da registrare.
    **/
    public void registerNewClient(ClientData client);
    
    /**
    * Restituisce le statistiche globali per il progetto.
    *
    * @return Restituisce le statistiche globali.
    */
    public GlobalStats giveMeStats();
    
    /**
    * Memorizza le statistiche del client passate come parametro. 
    *
    * @param client Indica il client a cui appartengono le statistiche.
    * @param stats Indica il pacchetto di statistiche da memorizzare.
    */
    public void saveClientStats(ClientStats stats);
}